package com.buaa.controller;

import cn.hutool.core.util.StrUtil;
import com.buaa.common.Result;
import com.buaa.dto.UserDTO;
import com.buaa.enums.ResponseCode;
import com.buaa.service.impl.UserActivityServiceImpl;
import com.buaa.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/*
* 用户登录控制类
* @apiNote 用户信息操作类。。。
* @author 1146,
* @Date 2024/6/10
*/
@Controller
@RestController
public class LoginController {

    @Autowired
    private UserServiceImpl userService;

    @Autowired
    private UserActivityServiceImpl userActivityServiceImpl;

    /**
     * 基于requst获取session
     * @param request
     * @return  获取session信息
     */
    @GetMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("userInfo", "userInfo");
        // 使用session对象
        return "LOGIN_VIEW";
    }



    @PostMapping("/logout")
    public Result logout(@RequestParam String policeId, @RequestParam String userName){
        // 从userDTO中提取用户名
//        String username=userDTO.getPoliceId();
          String username = policeId;

        // 检查用户名是否为空，如果为空，则返回相应的错误信息
        // 先对userDTO进行是否为空的校验
        //调用hutool工具中的StrUtil函数实现用户名和密码是否为空的判断
        if(StrUtil.isBlank(username)){
            return Result.error(ResponseCode.LOGIN_NOT_NULL.getKey(), ResponseCode.LOGIN_NOT_NULL.getDesc());
        }
        UserDTO userDTO = new UserDTO();
        userDTO.setPoliceId(policeId);
        try {
            // 调用userService的logout方法处理用户登出逻辑
            userService.logout(userDTO);
        }catch (Exception exception){
            // 捕获并打印任何在登出过程中发生的异常
            exception.printStackTrace();
        }
        // 返回登出成功的结果
        return Result.success(ResponseCode.LOGOUT_SUCCESS.getKey(), ResponseCode.LOGOUT_SUCCESS.getDesc(),"");
    }


    /**
     * 处理用户登录请求
     * @apiNote 该函数是一个登录处理函数，使用@PostMapping注解指定请求方法为POST，请求路径为/login。函数接收一个@RequestBody注解的UserDTO对象作为参数，该对象包含了用户名和密码信息。
     *  函数首先从userDTO对象中获取用户名和密码。然后使用StrUtil函数判断用户名和密码是否为空。如果为空，则返回一个错误结果，包含错误码和错误信息。 如果用户名和密码不为空，则调用userService.login(userDTO)方法进行登录处理。如果登录成功，该方法会返回一个包含登录成功信息和登录用户信息的UserDTO对象。如果登录失败，会抛出异常。
     *  最后，根据登录结果返回相应的响应。如果登录成功，返回一个成功结果，包含成功码、成功信息和登录用户信息。如果登录失败，返回一个错误结果，包含错误码和错误信息
     * @param userDTO 包含用户身份证号和密码的DTO对象。
     * @return 如果登录成功，返回包含成功信息和用户DTO的结果对象；如果登录失败，返回包含错误信息的结果对象。
     *
     */
    @PostMapping("/login")
    public Result login(@RequestBody UserDTO userDTO){
        // 从用户DTO中提取用户名和密码
        String username=userDTO.getPoliceId();//先对userDTO进行是否为空的校验
        String password=userDTO.getUserPassword();

        // 检查用户名和密码是否为空
        //调用hutool工具中的StrUtil函数实现用户名和密码是否为空的判断
        if(StrUtil.isBlank(username) || StrUtil.isBlank(password)){
            // 如果为空，返回登录信息不全的错误结果
            return Result.error(ResponseCode.LOGIN_NOT_NULL.getKey(), ResponseCode.LOGIN_NOT_NULL.getDesc());
        }

        UserDTO dto = null;
        try {
            // 调用用户服务进行登录验证
            dto = userService.login(userDTO);
        }catch (Exception exception){
            // 登录过程中发生异常，抛出异常以便进一步处理
            throw exception;
        }

        // 如果登录成功，返回包含成功信息和用户DTO的结果
        return Result.success(ResponseCode.LOGIN_SUCCESS.getKey(), ResponseCode.LOGIN_SUCCESS.getDesc(), dto);
    }

}
